"""
https://leetcode.cn/problems/path-sum-ii/description/

113. 路径总和 II
中等
相关标签
premium lock icon
相关企业
给你二叉树的根节点 root 和一个整数目标和 targetSum ，找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

 

示例 1：


输入：root = [5,4,8,11,None,13,4,7,2,None,None,5,1], targetSum = 22
输出：[[5,4,11,2],[5,8,4,5]]
示例 2：


输入：root = [1,2,3], targetSum = 5
输出：[]
示例 3：

输入：root = [1,2], targetSum = 0
输出：[]
 

提示：

树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000


"""

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from typing import Optional,List
from tree_node import TreeNode,build_tree_node


class Solution:

    """
    此题与s112极为相似。
    区别在于，需要返回全部集合。

    逻辑和主流逻辑一致。
    部分写法差异导致效率低，忽略之
    
    """

    def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
        if not root:
            return []

        def itr(node:TreeNode,target:int,parent_path:List[int]=[])->List[List[int]]:
            if not node.left and not node.right:
                if target==node.val:
                    return [parent_path+[node.val]]
                return []
            new_target=target-node.val
            new_parent_path=parent_path+[node.val]
            # print(f'{node.val}->{new_target}')
            total_res=[]
            if node.left:
                left_res=itr(node.left,new_target,new_parent_path)
                total_res.extend(left_res)
            if node.right:
                right_res=itr(node.right,new_target,new_parent_path)
                total_res.extend(right_res)
            return total_res
        
        return itr(root,targetSum)
    
if __name__=='__main__':
    arr=[5,4,8,11,None,13,4,7,2,None,None,5,1]
    root=build_tree_node(arr)
    target_sum=22

    s=Solution()
    res=s.pathSum(root,target_sum)
    print(res)